#include <iostream>
// 随着项目的增大，名称相互冲突的可能性也将增加，使用多个厂商的类库时，可能导致名称冲突。
// C++新增了这样一种功能，即通过定义一种新的声明区域来创建命名的命名称空间。
// 一个名称空间中的名称不会与另外一个空间中的名称发生冲突，同时允许程序的其他部分使用该名称空间中声明的东西

// 名称空间可以是全局的，也可以位于另一个命名空间中，但不能位于代码块中，因此在默认情况下,在名称空间中声明的名称的链接性为外部的(除非它引用了常量)
namespace Jack
{
    double pail;        // 声明变量
    void fetch();       // 函数声明(函数原型)
    int pal;            // 声明变量
    struct Well         // 声明结构类型
    {
        // ...
    };
    
} 

namespace Jill
{
    double bucket(double n);
} // namespace Jill

// 任何名称空间中的名称都不会与其他名称空间的名称发生冲突
// 同样,在原来Jack名称空间中，fetch()函数提供了原型，可以在该文件后面或者在另外一个文件中，再次使用Jack名称空间来提供该函数的代码

namespace Jack
{
    void fetch(){
       std::cout << "/* message */" << std::endl;
    }
}

namespace Jill
{
    double bucket(double n){
        return n * n;
    }
} // namespace Jill


int main(int argc, const char** argv) {

    // 需要一种方法用来给定名称空间的名称，最简单的方法是通过作用域解析运算符(::)
    Jack::pail = 12.34;
    std::cout << "Jill::bucket(12.34)" << " = " << Jill::bucket(12.34) << std::endl;
    
    // 注: "::"还有一种用法,表示这个变量的全局版本
    return 0;
}

